package com.ruoyi.water.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.water.domain.Element;
import com.ruoyi.water.service.IElementService;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

@RestController
@RequestMapping("/water/element")
public class ElementController {

    @Autowired
    private IElementService elementService;


    /**
     * 分页查询元素列表（支持条件查询）
     * @权限：water:element:list
     * @接口：GET /water/element/list
     * @参数：
     *   - pageNum: 页码（默认1）
     *   - pageSize: 每页条数（默认10）
     *   - 其他Element对象的属性作为查询条件
     */
    @PreAuthorize("@ss.hasPermi('water:element:list')")
    @GetMapping("/list")
    public AjaxResult list(Element element,
                           @RequestParam(defaultValue = "1") Integer pageNum,
                           @RequestParam(defaultValue = "10") Integer pageSize) {
        // 1. 构建分页对象
        Page<Element> page = new Page<>(pageNum, pageSize);

        // 2. 构建查询条件（非空字段才作为查询条件）
        QueryWrapper<Element> queryWrapper = new QueryWrapper<>();
        // 如果FirstAreaId不为空，则添加精确查询条件
        if (element.getFirstAreaId() != null) {
            queryWrapper.eq("FirstAreaId", element.getFirstAreaId());
        }
        //如果ElemName不为空，则添加模糊查询条件
        if (element.getElemName() != null && !element.getElemName().isEmpty()) {
            queryWrapper.like("ElemName", element.getElemName());
        }

        // 3. 调用MyBatis-Plus的分页查询方法
        IPage<Element> pageResult = elementService.page(page, queryWrapper);

        // 4. 封装分页结果（ajaxresult兼容若依的TableDataInfo格式）
        return AjaxResult.success()
                .put("total", pageResult.getTotal())        // 总条数
                .put("rows", pageResult.getRecords())      // 当前页数据
                .put("pageNum", pageResult.getCurrent())   // 当前页码
                .put("pageSize", pageResult.getSize())     // 每页条数
                .put("pages", pageResult.getPages());      // 总页数
    }

    /**
     * 导出水元素列表
     * @权限：water:element:export
     * @接口：POST /water/element/export
     * @参数：Element对象的属性作为查询条件
     */
    @PreAuthorize("@ss.hasPermi('water:element:export')")
    @Log(title = "元素管理", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, Element element) {
        // 构建查询条件
        QueryWrapper<Element> queryWrapper = new QueryWrapper<>();
        // 如果FirstAreaId不为空，则添加精确查询条件
        if (element.getFirstAreaId() != null) {
            queryWrapper.eq("FirstAreaId", element.getFirstAreaId());
        }
        //如果ElemName不为空，则添加模糊查询条件
        if (element.getElemName() != null && !element.getElemName().isEmpty()) {
            queryWrapper.like("ElemName", element.getElemName());
        }
        // 查询符合条件的所有数据（不分页）
        List<Element> list = elementService.list(queryWrapper);

        // 使用若依的Excel工具类导出
        ExcelUtil<Element> util = new ExcelUtil<>(Element.class);
        util.exportExcel(response, list, "元素数据");
    }


    /**
     * 查询单个元素（根据ID）
     * @权限：water:element:query
     * @接口：GET /water/element/{id}
     */
    @PreAuthorize("@ss.hasPermi('water:element:query')")
    @GetMapping("/{id}")
    public AjaxResult getInfo(@PathVariable Integer id) {
        Element element = elementService.getById(id);
        return AjaxResult.success(element);
    }


    /**
     * 新增元素
     * @权限：water:element:add
     * @接口：POST /water/element
     */
    @PreAuthorize("@ss.hasPermi('water:element:add')")
    @PostMapping
    public AjaxResult add(@Validated @RequestBody Element element) {
        boolean success = elementService.save(element);
        return success ? AjaxResult.success("新增成功") : AjaxResult.error("新增失败");
    }


    /**
     * 修改元素
     * @权限：water:element:edit
     * @接口：PUT /water/element
     */
    @PreAuthorize("@ss.hasPermi('water:element:edit')")
    @PutMapping
    public AjaxResult edit(@Validated @RequestBody Element element) {
        boolean success = elementService.updateById(element);
        return success ? AjaxResult.success("修改成功") : AjaxResult.error("修改失败");
    }


    /**
     * 删除元素（支持批量）
     * @权限：water:element:remove
     * @接口：DELETE /water/element/{ids}
     */
    @PreAuthorize("@ss.hasPermi('water:element:remove')")
    @DeleteMapping("/{ids}")
    public AjaxResult remove(@PathVariable String ids) {
        List<Integer> idList = Arrays.stream(ids.split(","))
                .map(Integer::parseInt)
                .collect(Collectors.toList());
        boolean success = elementService.removeByIds(idList);
        return success ? AjaxResult.success("删除成功") : AjaxResult.error("删除失败");
    }
}
